2022.1.20 星期四 :
教程
glob 是一种文件匹配模式,全称 global,它起源于 Unix 的 bash shell 中,比如在 linux 中常用的 mv .txt tmp/ 中,.txt 就使用到了这种模式。
# 1 glob 模式匹配简明教程
基础语法
通配符 | 描述 | 示例 | 匹配 | 不匹配 |
---|---|---|---|---|
* | 匹配0个或多个字符,包含空串 | Law* | Law, Laws和Lawer | La, aw |
? | 匹配1个字符 | ?at | cat, bat | at |
[abc] | 匹配括号内字符集合中的单个字符 | [cb]at | cat, bat | at, bcat |
[a-z] | 匹配括号内字符范围中的单个字符 | [a-z]at | aat, bat, zat | at, bcat, Bat |
[^abc]或[!abc] | 匹配括号内字符集合中的单个字符 | [cb]at | cat, bat | at, bcat |
[^a-z]或[!a-z] | 匹配括号内字符范围中的单个字符 | [a-z]at | aat, bat, zat | at, bcat, Bat |
扩展语法
除了基础语法外,bash 还支持 glob 的一些扩展语法,主要包含三种:
Brace Expansion
globstar
extglob
三种扩展语法的定义和描述如下:
通配符 | 描述 | 示例 | 匹配 | 不匹配 | |
---|---|---|---|---|---|
{x, y, …} | Brace Expansion,展开花括号内容,支持展开嵌套括号 | a.{png,jp{,e}g} | a.png, a.jpg, a.jpeg | ||
** | globstar,匹配所有文件和任意层目录,如果**后面紧接着/则只匹配目录,不含隐藏目录 | src/** | src/a.js, src/b/a.js, src/b/ | src/.hide/a.js | |
?(pattern-list) | 匹配0次或1次给定的模式 | a.?(txt | bin) | a., a.txt, a.bin | a |
*(pattern-list) | 匹配0次或多次给定的模式 | a.*(txt | bin) | a., a.txt, a.bin, a.txtbin | a |
+(pattern-list) | 匹配1次或多次给定的模式 | a.+(txt | bin) | a.txt, a.bin, a.txtbin | a., a |
@(pattern-list) | 匹配给定的模式 | a.@(txt | bin) | a.txt, a.bin | a., a.txtbin |
!(pattern-list) | 匹配非给定的模式 | a.!(txt | bin) | a., a.txtbin | a.txt, a.bin |
与 regexp 的差异
glob 模式主要用于匹配文件路径,当然也可以用于匹配字符串,不过在匹配字符串的能力上比 regexp 要弱很多。由于 glob 模式和 regexp 存在相同的元字符,但是含义却不同,容易导致混淆,为了避免混淆,下面将 glob 模式转换成对应的 regexp 表示,以便区分他们的异同点。
glob | regexp | 精确的 regexp
* | . | ^(?!.)[^\/]?$
? | . | ^(?!.)[^\/]$
[a-z] | [a-z] | ^[a-z]$
glob 匹配的是整个字符串,而 regexp 默认匹配的是子串,regexp 如果要匹配整个字符串需显式指定^和$。正则表达式中的(?!.),其表示不匹配隐藏文件